#include "borrowandrepay.h"

BRNode* brhead=NULL;
//创建节点
BRNode* creatBRNode(BRBook data){
	BRNode* pNew = (BRNode*)malloc(SIZE_BR);
	//异常处理
	if(NULL == pNew) return NULL;
	//初始化
	pNew->date=data;
	pNew->pL=pNew->pR=NULL;
	return pNew;
}
//节点尾插
void tailBRNode(BRNode** phead,BRBook data){
	//异常处理
	if(NULL == phead) return;
	BRNode* ptail=creatBRNode(data);
	if(NULL == *phead){//链表为空
		*phead=ptail;
	}else{//链表不为空，找到尾
		BRNode* ptemp=*phead;
		while(ptemp->pR){
			ptemp=ptemp->pR;
		}
		ptemp->pR=ptail;
		ptail->pL=ptemp;
	}
}

//通过用户账号查询用户借的书 并在这个函数里面输出
void findBRNodebyAccount(BRNode* head,char* account){
	//异常处理
	if(NULL == head){
		printf("你一本书都没借哦\n");
		return;
	}
	BRNode* ptemp=head;
	int n=0;
	while(ptemp){
		if(!strcmp(ptemp->date.who,account)){//找到一次就输出一次
			printf("你借的书有\n");
			printf("%s\n",ptemp->date.data.bookName);
			n++;//标记输出多少次，一次都没有就是没借书
		}
		ptemp=ptemp->pR;
	}
	if(0 == n){
		printf("你一本书都没借哦\n");
		jindu(2);
		UserofBookBorrowandRepay(account);
	}
}
//用户还书 根据书名和账号去在存储用户借书的链表中匹配 匹配成功就删除，表示还书
void repaybook(char* bookname,char* account){
	BRNode* prepay=findbrnode(brhead,bookname,account);
	if(NULL == prepay) return;
	//匹配成功，直接删
	//如果删除的头节点并且只有头节点，直接头节点为空
	if(prepay == brhead){
		brhead=NULL;
		printf("还书成功\n");
		jindu(1);
	}else if(NULL == prepay->pR){//如果是尾节点
		prepay->pL->pR=prepay->pR;
		//prepay->pR->pL=prepay->pL;
		printf("还书成功\n");
		jindu(1);
	}else{//中间节点
		prepay->pL->pR=prepay->pR;
		prepay->pR->pL=prepay->pL;
		printf("还书成功\n");
		jindu(1);
	}
}
//找到存储账号的节点
BRNode* findbrnode(BRNode* head,char* bookname,char* account){
	//异常处理
	if(NULL == head){
		printf("库中无信息\n");
		return NULL;
	}
	BRNode* ptemp=head;
	while(ptemp){
		if((!strcmp(ptemp->date.data.bookName,bookname)) && (!strcmp(ptemp->date.who,account)))
			return ptemp;
		ptemp=ptemp->pR;
	}
}

//存储借还书信息 存到文件中
void saveBorrowAndRepay(){
	FILE* fpwrite=fopen("borrowandrepay.txt","w");
	//异常处理
	if(NULL == fpwrite){
		printf("文件打开失败\n");
		return ;
	}
	BRNode* pTemp=brhead;
	while(pTemp){
		fwrite(&(pTemp->date),1,sizeof(BRBook),fpwrite);
		pTemp=pTemp->pR;
	}
	fclose(fpwrite);
}
//从文件中读取借还书信息 组成新的链表
void readBorrowAndRepay(BRNode** phead){
	FILE* fpread=fopen("borrowandrepay.txt","r");
	if(NULL == fpread){
		printf("文件打开失败\n");
		return ;
	}
	int r;
	BRBook temp;
	while(1){
		r = fread(&temp,1,sizeof(BRBook),fpread);
		if(r <= 0) break;
		tailBRNode(phead,temp);
	}
	fclose(fpread);
}